package com.after.saas.file.listener;

import com.after.saas.file.domain.vo.ExcelErrorVO;
import com.after.saas.file.function.ExcelConsumer;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * @author by hjchen
 * @Classname DefaultExcuteListener
 * @Description TODO
 * @Date 2021/3/24 16:53
 */

@Slf4j
@Data
public class DefaultReadEventListener<T> extends AnalysisEventListener<T> {

    private List<T> data = new ArrayList<>();

    protected List<ExcelErrorVO> errorInfo = new ArrayList<>();
    /**
     * 假设这个是一个DAO，当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。这里我们传入自己的function作为参数
     */
    private ExcelConsumer<T> consumer;

    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     */
    public DefaultReadEventListener(ExcelConsumer<T> consumer) {
        this.consumer = consumer;
    }

    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
        data.add(t);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("read over {}", data.size());
        System.out.println(JSON.toJSON(data));
        // 这里也要保存数据，确保最后遗留的数据也存储到数据库
        consumer.executeRead(data);
        consumer.check(data);
    }
}